// 筛法求素数
#include <stdio.h>

int main()
{
    // 输入N
    int n;
    scanf("%d", &n);

    // 布尔数组 f, f[i] 的值只可能是0或者1，1代表没有删除，0代表被删除了
    char f[n + 1]; // 为什么要申请n+1长度的数组，思考一下为什么并回答。

    // f[0] f[1]，不是素数，赋值为0，删除。
    f[0] = 0;
    f[1] = 0;

    // f[2] 到 f[n] 所有的值都赋值为1，即没有被删除
    for (int i = 2; i <= n; i++)
        f[i] = 1;

    // 筛法求素数开始：

    for (int i = 2; i <= n; i++)
    {
        // 如果f[i] == 1，那么f[i]还未被删除，则必定为素数，思考一下为什么并回答。
        // 如果f[i] == 0，那么f[i]已经被删除，则必不是素数，思考一下为什么并回答。
        if (f[i])
        {
            // 如果f[i]是素数，那么删除它所有的倍数，2*i, 3*i, ...

            // TODO

            for (int j = 2; i * j <= n; j++)
                f[i * j] = 0;

            // 注意，数组f只有n+1的大小, 即 f[0], f[1], ... , f[n]，访问或操作 f[n+1] 或更外面的值，程序会发生错误。
        }
    }

    int count = 0;
    // 统计素数的个数并存储在count种

    // TODO
    for (int i = 2; i <= n; i++)
        if (f[i])
            count++;

    // 输出2-N之间素数的个数
    printf("%d\n", count);

    // 输出2-N之间所有的素数
    for (int i = 2; i <= n; i++)
        if (f[i])
            printf("%d\n", i);

    return 0;
}

/**
举例
比如 N = 30

一开始，序列为
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

删除2的倍数
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29

删除3的倍数
2 3 5 7 11 13 17 19 23 25 29

删除5的倍数
2 3 5 7 11 13 17 19 23 29

...

依次删除7,11,13,17,19,23,29的倍数

...

最后得
2 3 5 7 11 13 17 19 23 29

即是 1-30 之间的所有素数


*/
